#include <iostream>
#include <cuda_runtime.h>

int main() {
    int maxThreadsPerBlock;
    int maxBlockDimX, maxBlockDimY, maxBlockDimZ;
    int maxGridDimX, maxGridDimY, maxGridDimZ;
    int warpSize;
    int multiProcessorCount;

    cudaDeviceGetAttribute(&maxThreadsPerBlock, cudaDevAttrMaxThreadsPerBlock, 0);
    cudaDeviceGetAttribute(&maxBlockDimX, cudaDevAttrMaxBlockDimX, 0);
    cudaDeviceGetAttribute(&maxBlockDimY, cudaDevAttrMaxBlockDimY, 0);
    cudaDeviceGetAttribute(&maxBlockDimZ, cudaDevAttrMaxBlockDimZ, 0);
    cudaDeviceGetAttribute(&maxGridDimX, cudaDevAttrMaxGridDimX, 0);
    cudaDeviceGetAttribute(&maxGridDimY, cudaDevAttrMaxGridDimY, 0);
    cudaDeviceGetAttribute(&maxGridDimZ, cudaDevAttrMaxGridDimZ, 0);
    cudaDeviceGetAttribute(&warpSize, cudaDevAttrWarpSize, 0);
    cudaDeviceGetAttribute(&multiProcessorCount, cudaDevAttrMultiProcessorCount, 0);

    std::cout << "Max threads per block: " << maxThreadsPerBlock << std::endl;
    std::cout << "Max block dimensions: " << maxBlockDimX << " x " << maxBlockDimY << " x " << maxBlockDimZ << std::endl;
    std::cout << "Max grid dimensions: " << maxGridDimX << " x " << maxGridDimY << " x " << maxGridDimZ << std::endl;
    std::cout << "Warp size: " << warpSize << std::endl;
    std::cout << "Multi-processor count: " << multiProcessorCount << std::endl;

    return 0;
}
